package tfc_editor.userManagement;

import tfc_editor.pastrytools.PastryManager;

/**
 * Classe que conte funcions d'ajuda al maneig d'usuaris.
 * @author Ismael Gonzalez Burgos
 *
 */
public class UserUtils
{
	final static public String UserDataKeyHeader = "UsersData::";
	final static public String FileDataKeyHeader = "FileData::";
	final static public String FileDataSharedKeyHeader = "FileDataShared::";
	final static public int LOGIN_MAX_LEN 		= 12;
	final static public int PASSWORD_MAX_LEN	= 12;
	final static public int FILENAME_MAX_LEN	= 255;
	public static UserData ActiveUser;

	private PastryManager pm;

	/**
	 * Constructor de la classe.
	 * @param PM Punter a la classe PastryManager.
	 */
	public UserUtils(PastryManager PM)
	{
		pm = PM;
	}

	/**
	 * Funcio que ens retorna un UserData donat un login.
	 * @param User Login de l'usuari.
	 * @return UserData amb les dades.
	 * @throws UserManagementException Es produeix si no es troba l'usuari.
	 */
	public UserData GetUserDataFromLogIn(String User) throws UserManagementException
	{
		String Value = UserDataKeyHeader + User; 
		String pass = pm.GetKeyStringString(Value);
		
		if (pass==null)
			throw new UserManagementException(UserManagementException.USER_DOESNT_EXIST);

		return new UserData(User,pass);
	}

	/**
	 * Funcio que ens indica si un usuari existeix al sistema o no.
	 * @param uc UserData que volem comprobar.
	 * @return Si l'usuari es valid.
	 * @throws UserManagementException Es produeix quan l'usuari no es valid. 
	 */
	public boolean ValidateUserData(UserData uc) throws UserManagementException
	{
		UserData uds = GetUserDataFromLogIn(uc.GetLogin());
		if (uds.GetPassword().equals(uc.GetPassword()))
			return true;
		
		throw new UserManagementException(UserManagementException.INVALID_PASSWORD);
	}
	
	/**
	 * Funcio que fa un usuari actiu al sistema.
	 * @param uc UserData de l'usuari que volem activar.
	 */
	public void SetActiveUser(UserData uc)
	{
		ActiveUser = new UserData(uc.GetLogin(),uc.GetPassword());
	}

	/**
	 * Funcio que guardar un usuari a la DHT.
	 * @param User UserData amb les dades de l'usuari a guardar.
	 * @throws UserManagementException Excepcio que es produeix si tenim algun error.
	 */
	public void WriteUser(UserData User) throws UserManagementException
	{
		boolean Exists = true;

		try
		{
			GetUserDataFromLogIn(User.GetLogin());
		} catch (UserManagementException e)
		{
			Exists = false;
		}

		if (!Exists)
		{
			String uc = UserDataKeyHeader + User.GetLogin();
			String pc = User.GetPassword();
			pm.AddKeyStringString(uc,pc);			
		}
		else
		{
			throw new UserManagementException(UserManagementException.USER_ALREADY_EXISTS);
		}
	}
}
